/* The file is saved in UTF-8 codepage.
 * Check: «Stereotype», Section mark-§, Copyright-©, Alpha-α, Beta-β, Smile-☺
 */
package cz.pecinovsky.english.lootp._134_;

//import cz.pecinovsky.english.lootp._134_.StavitelOkruhů_134_.StavitelOkruhů;


import cz.pecinovsky.english.lootp.manager.CanvasManager_Envelope.               CanvasManager;


import cz.pecinovsky.english.lootp._134_.Ring_134_.Ring;
import cz.pecinovsky.english.lootp._134_.RoadField_134_.RoadField;
import cz.pecinovsky.english.lootp._134_.StavStavitele_142_.StavStavitele;

//import cz.pecinovsky.english.lootp._134_.StavitelOkruhů_134_ .StavitelOkruhů;
////////////////////////////////////////////////////////////////////////////////
//%%+  +++++ End of ignored starting test - place for imports +++++
//%I+
//
//import cz.pecinovsky.english.lootp.canvasmanager.CanvasManager;
//%I-

import cz.pecinovsky.english.lootp.utility.NamedColor;
import cz.pecinovsky.english.lootp.utility.Position;
import cz.pecinovsky.english.lootp.utility.Direction8;


import static cz.pecinovsky.english.lootp._134_.StavStavitele_142_.StavStavitele.*;


//%I+ >142
//import cz.pecinovsky.english.lootp.town.StavStavitele.*;
//%I-
//%X+ xxxxx Start of the ovejumped text with declaration of the envelope xxxxx
/*******************************************************************************
 *<pre>
 * Předchozí:   Není - toto_je_nově_definovaná_třída
 *              Ttt v projektu Ppp
 * Následující: Prozatím není
 *
 * Projekt  Ppp
 *   + Přidáno
 *   - Odebráno
 *   ~ Změněno
 *</pre>
 */
public class StavitelOkruhů_134_
{    private StavitelOkruhů_134_() {}   static
////////////////////////////////////////////////////////////////////////////////
//%X- ----- End of the ovejumped text with declaration of the envelope -----


/*******************************************************************************
 * Instance třídy {@code StavitelOkruhů} představují stavitele,
 * kteří umějí vybudovat okruhy poskládané z instancí třídy {@link RoadField}.
 *
 * @author Rudolf PECINOVSKÝ
 * @version 6.03.2017 — 2010-11-08
 */
public class StavitelOkruhů
{
//== CONSTANT CLASS ATTRIBUTES =================================================

    /** Správce plátna, na němž bude okruh zobrazen. */
    CanvasManager CM = CanvasManager.getInstance();

    /** Implicitní color cest. */
    private static final NamedColor IMPLICINÍ_BARVA = NamedColor.GRAY;



//== VARIABLE CLASS ATTRIBUTES =================================================
//== STATIC CONSTRUCTOR (CLASS INITIALIZER, STATIC INICITALIZING BLOCK) ========
//== CONSTANT INSTANCE ATTRIBUTES ==============================================

    /** Position, na kterou bude umístěno první pole okruhu. */
    private final Position počPozice;

    /** NamedColor budované cesty. */
    private final NamedColor color;



//== VARIABLE INSTANCE ATTRIBUTES ==============================================

    /** Počáteční pole okruhu. Je-li okruh uzavřen, je shodné s koncovým. */
    private RoadField první;

    /** Koncové pole okruhu. Je-li okruh uzavřen, je shodné s počátečním. */
    private RoadField poslední;
//%A+ >142

    /** Stavv, v němž se builder právě nachází a který ovlivňuje,
     * jaké příkazy je ochoten akceptovat. */
    StavStavitele state = PŘIPRAVENÝ;
//%A-



//== CLASS GETTERS AND SETTERS =================================================
//== OTHER NON-PRIVATE CLASS METHODS ===========================================

//##############################################################################
//== CONSTUCTORS AND FACTORY METHODS ===========================================

    /***************************************************************************
     * Vytvoří stavitele, který bude od zadané výchozí pozice
     * stavět okruh implicitní barvy.
     *
     * @param počPozice Position počátečního pole
     */
    public StavitelOkruhů(Position počPozice)
    {
        this(počPozice, IMPLICINÍ_BARVA);
    }


    /***************************************************************************
     * Vytvoří stavitele, který bude od zadané výchozí pozice
     * stavět okruh zadané barvy.
     *
     * @param počPozice Position počátečního bloku
     * @param color     NamedColor cesty
     */
    public StavitelOkruhů(Position počPozice, NamedColor color)
    {
        this.počPozice = počPozice;
        this.color     = color;
    }



//== ABSTRACT METHODS ==========================================================
//== INSTANCE GETTERS AND SETTERS ==============================================

    /***************************************************************************
     * Vrátí právě vytvořený okruh.
     *
     * @return Vytvořený okruh
     */
    public Ring getOkruh()
    {
//%A+ >142
        if (state != UKONČENÝ) {
            throw new RuntimeException(
                "\nTvorba okruhu ještě není ukončena - je ve stavu: " + state);
        }
        state = PŘIPRAVENÝ;
//%A-
        return new Ring(první);
    }



//== OTHER NON-PRIVATE INSTANCE METHODS ========================================

    /***************************************************************************
     * Přidá k okruhu další blok cesty, který bude průjezdný zadaným směrem.
     *
     * @param direction Směr průjezdnosti přidávaného bloku
     */
    public void zahajNa(Direction8 direction)
    {
//%A+ >142
        if (state != PŘIPRAVENÝ) {
            throw new RuntimeException(
               "\nTvorbu okruhu nelze zahájit - builder je ve stavu: " + state);
        }
        state = BUDUJÍCÍ;
//%A-
        poslední = new RoadField(počPozice, CM.getStep(), direction, color);
//%I+ <141
//        CM.add(poslední);
//%I-
        první = poslední;
    }


    /***************************************************************************
     * Přidá k okruhu další blok cesty, který bude průjezdný zadaným směrem.
     *
     * @param direction Směr průjezdnosti přidávaného bloku
     */
    public void pokračujNa(Direction8 direction)
    {
//%A+ >142
        if (state != BUDUJÍCÍ) {
            throw new RuntimeException(
               "\nV tvorbě okruhu nelze pokračovat - builder je ve stavu: " +
               state);
        }
//%A-
        poslední = new RoadField(poslední, direction);
//%I+ <141
//        CM.add(poslední);
//%I-
    }


    /***************************************************************************
     * Přidá k okruhu závěrečný blok průjezdný zadaným směrem.
     * Tento blok napojí na počáteční blok celé sady, čímž uzavře okruh.
     *
     * @param direction Směr průjezdnosti přidávaného bloku
     */
    public void closeTo(Direction8 direction)
    {
//%A+ >142
        if (state != BUDUJÍCÍ) {
            throw new RuntimeException(
               "\nTvorbu okruhu nelze ukončit - builder je ve stavu: " + state);
        }
        state = UKONČENÝ;
//%A-
        poslední = new RoadField(poslední, direction, první);
//%I+ <141
//        CM.add(poslední);
//%I-
    }


    /***************************************************************************
     * Vrací textovou reprezentaci (podpis) dané instance
     * používanou především k ladicím účelům.
     *
     * @return Požadovaná textová reprezentace
     */
    @Override
    public String toString()
    {
        return "StavitelCest_(počátek=" + počPozice + ", color=" + color +
               ", první=" + první + ", poslední=" + poslední + ")";
    }



//== PRIVATE AND AUXILIARY CLASS METHODS =======================================
//== PRIVATE AND AUXILIARY INSTANCE METHODS ====================================
//== EMBEDDED TYPES AND INNER CLASSES ==========================================
//== TESTING CLASSES AND METHODS ===============================================
//
//    /***************************************************************************
//     * Test method.
//     */
//    public static void test()
//    {
//        StavitelOkruhů inst = new StavitelOkruhů();
//    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
//    public static void main(String[] args)  {  test();  }
    }

//%%- ---- Start of the ovejumped text with closing of the envelope ----
////////////////////////////////////////////////////////////////////////////////
//== TESTING CLASSES AND METHODS ===============================================
//
//    /***************************************************************************
//     * Test method.
//     */
//    public static void test()
//    {
//        System.exit(0);
//    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
//    public static void main(String[] args)  {  test();  }
}
